package org.jsola.hr.dao;

import org.apache.ibatis.annotations.Param;
import org.jsola.hr.entity.EmpInfoDO;
import org.jsola.hr.entity.TemplateFieldDO;
import org.jsola.hr.query.EmpCountQuery;
import org.jsola.hr.query.EmpListQuery;
import org.jsola.hr.query.EmpSocPageQuery;
import org.jsola.hr.vo.*;
import org.jsola.orm.mapper.IJsolaMapper;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * @author zhr
 */
@Repository("hrEmpInfoDAO")
public interface IEmpInfoDAO extends IJsolaMapper<EmpInfoDO> {

    /**
     * 查询模板参数值列表
     *
     * @param templateFieldDOList 参数集合
     * @return 模板参数值集合
     */
    Map<String, Object> selectParamList(@Param("templateFieldDOList") List<TemplateFieldDO> templateFieldDOList, @Param("empId") String empId);

    /**
     * 查询员工列表及工资
     *
     * @param empInfoDO 员工参数
     * @param siteId    站点ID
     * @return 员工列表及工资
     */
    List<EmpInfoDO> listWithSalary(@Param("empInfoDO") EmpInfoDO empInfoDO, @Param("siteId") String siteId);

    /**
     * 查询员工岗位信息
     *
     * @param empInfoId 员工ID
     * @param siteId    所属站点id
     * @return 员工岗位信息
     */
    EmpInfoPositionVO findEmpInfoPosition(@Param("companyId") String companyId, @Param("empInfoId") String empInfoId, @Param("siteId") String siteId);

    /**
     * 查询员工相关合同信息
     *
     * @param empIdArray 员工ID集合
     * @return List<EmpInfoListVO>
     */
    List<EmpInfoContractVO> getEmpInfoListForContract(@Param(value = "empIdArray") String[] empIdArray);

    /**
     * 根据手机号集合和companyId查询员工集合
     *
     * @param phoneList 手机号集合
     * @param companyId 公司id
     * @return 员工集合
     */
    List<EmpInfoDO> selectEmpInfoListByPhoneList(@Param(value = "phoneList") List<String> phoneList, @Param(value = "companyId") String companyId);

    /**
     * 根据手机号查询员工所有站点集合
     *
     * @param phone 手机号
     * @return 该手机号对应的所有站点
     */
    List<String> getSiteIdListByPhone(String phone);

    /**
     * 根据id更新当前站点下的所有员工姓名拼音
     *
     * @param list   更新信息
     * @param date   当前时间
     * @param userId 更新人id
     * @return 更新结果
     */
    Integer updatePinyin(@Param(value = "list") List<EmpInfoDO> list, @Param(value = "date") Date date, @Param(value = "userId") String userId);

    /**
     * 获取员工简略信息及部门
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 员工简略信息及部门id
     */
    List<EmpReduceInfoVO> listEmpReduceAndDepInfo(@Param("companyId") String companyId, @Param(value = "siteId") String siteId);

    /**
     * 获取员工简略信息及岗位
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 员工简略信息及岗位id
     */
    List<EmpReduceInfoVO> listEmpReduceAndPositionInfo(@Param("companyId") String companyId, @Param(value = "siteId") String siteId);

    /**
     * 查询签署合同状态员工列表
     *
     * @param empListQuery  员工信息参数
     * @param signingStatus 合同签署状态
     * @param startingIndex 数据起始下标
     * @param siteId        站点
     * @return 员工列表
     */
    List<EmpInfoContractVO> pageEmpListBySigningStatus(@Param("empListQuery") EmpListQuery empListQuery, @Param("signingStatus") Integer signingStatus, @Param("startingIndex") Integer startingIndex, @Param("siteId") String siteId);

    /**
     * 查询签署合同状态员工数量
     *
     * @param empListQuery  员工信息参数
     * @param signingStatus 合同签署状态
     * @param startingIndex 数据起始下标
     * @param siteId        站点
     * @return 员工列表
     */
    int empInfoContractCountBySigningStatus(@Param("empListQuery") EmpListQuery empListQuery, @Param("signingStatus") Integer signingStatus, @Param("startingIndex") Integer startingIndex, @Param("siteId") String siteId);


    /**
     * 获取站点下所有在职员工简略信息(待入职+在职+待离职)
     *
     * @param siteId 站点id
     * @return 站点下所有在职员工简略信息
     */
    List<EmpReduceInfoVO> listOnJobEmpReduceBySite(@Param(value = "siteId") String siteId);


    /**
     * 获取部门下员工信息
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 部门下员工信息
     */
    List<EmpReduceInfoVO> listDepEmpInfo(@Param("companyId") String companyId, @Param(value = "siteId") String siteId);

    /**
     * 根据员工ID查询员工社保简略信息
     *
     * @param empIdList 员工Id列表
     * @return 员工简略信息列表
     */
    List<EmpSocDetailsVO> selectEmpSocByEmpIdList(@Param("empIdList") List<String> empIdList);

    /**
     * 增员筛选员工
     * @param empSocPageQuery 查询参数
     * @param siteId 站点
     * @return 员工信息
     */
    List<EmpInfoDO> increaseSiftEmp(@Param("empSocPageQuery") EmpSocPageQuery empSocPageQuery,
                                    @Param(value = "siteId") String siteId);

    /**
     * 减员筛选员工
     * @param empSocPageQuery 查询参数
     * @param siteId 站点
     * @return 员工信息
     */
    List<EmpInfoDO> decreaseSiftEmp(@Param("empSocPageQuery") EmpSocPageQuery empSocPageQuery,
                                    @Param(value = "siteId") String siteId);

    /**
     * 删除checkId的数据
     *
     * @param phone 手机号
     * @param siteId 站点
     */
    void deleteEmpByPhone(@Param("phone")String phone,@Param("siteId") String siteId);

    /**
     * 获取已转正的员工365天内退休的员工
     *
     * @return 已转正的员工365天内退休的员工
     */
    List<EmpInfoDO> listBeFormalTask();

    /**
     * 小程序人员分页
     *
     * @param empCountQuery 查询对象
     * @param siteId        站点
     * @return 分页对象
     */
    List<EmpInfoDO> pageEmpListForMini(@Param("empCountQuery") EmpCountQuery empCountQuery,
                                       @Param("siteId") String siteId);

    /**
     * 获取员工简略信息
     *
     * @param empIdList 员工 Id 列表
     * @return 员工简略信息
     */
    List<EmpReduceInfoVO> selectEmpReduceInfoByIdList(@Param(value = "empIdList") List<String> empIdList);

    List<String> listEmpIdByCompany(@Param(value = "companyId")String companyId, @Param(value = "siteId")String siteId);
}


